#include <stdio.h>
#include <stdlib.h>

typedef struct SeqNode *SeqPtr;
struct SeqNode {
    int *array; /* 存储数据的数组 */
    int n; /* 数组的大小 */
    int max_sum; /* 最大和 */
    int start, finish; /* 最大连续子序列左右两端点的数组下标 */
};

/* 算法1-9：连续子序列最大和的O(n)算法 MaxSubsequenceSum3(s) */
int MaxSubsequenceSum3(SeqPtr s) {
    int j, this_sum, this_start;

    s->max_sum = 0;
    s->start = s->finish = -1;
    this_sum = 0;
    this_start = 0; /* 初始化最大连续子序列起始位置 */
    for (j = 0; j < s->n; j++) {
        this_sum += s->array[j]; /* 计算当前子序列和 */
        if (this_sum > s->max_sum) { /* 若当前和更大 */
            s->max_sum = this_sum; /* 更新最大和 */
            s->start = this_start; /* 更新最大连续子序列起始位置 */
            s->finish = j; /* 更新最大连续子序列终止位置 */
        } else if (this_sum < 0) { /* 若当前和为负数 */
            this_sum = 0; /* 则不可能让后继的和更大，抛弃之 */
            this_start = j +
                         1; /* 重新开始一段连续子序列，更新起始位置 */
        }
    }
    return s->max_sum;
}
/* 算法1-9 结束 */

int main(void) {
    int i;
    SeqPtr s;

    s = (SeqPtr)malloc(sizeof(struct SeqNode));
    scanf("%d", &s->n);
    s->array = (int *)malloc(sizeof(int) * s->n);
    for (i = 0; i < s->n; i++) {
        scanf("%d", &s->array[i]);
    }
    printf("%d\n", MaxSubsequenceSum3(s));
    printf("%d %d\n", s->start, s->finish);
    return 0;
}